home *** CD-ROM | disk | FTP | other *** search
/ The AGA Experience 3 / AGA Experience Volume 3 (1997)(NFA - SAdENESS)[!].iso / software / utilities / emulation / qdos3 / sys_ref_bas < prev    next >
Encoding:
Text File  |  1996-03-06  |  18.9 KB  |  592 lines

  1. 10  TURBO_objfil "ram1_SYS_REF_task"
  2. 11  TURBO_taskn "SYS_REF"
  3. 12  TURBO_repfil "scr"
  4. 13  TURBO_windo 0
  5. 14  TURBO_diags 'omit'
  6. 15  TURBO_struct "S"
  7. 16  TURBO_model "<"
  8. 17  TURBO_objdat 10
  9. 18  TURBO_optim "R"
  10. 19 :
  11. 1000 REMark ------------------------------
  12. 1010 REMark    SYS_REF_bas - Mark J Swift
  13. 1070 REMark ------------------------------
  14. 1080 :
  15. 1170 DIM InFile$(100),OutFile$(100),Rplc$(1),P$(256),Src$(5),Dst$(40),Name$(40),Space$(40),temp$(40),nam$(64),pch$(256),a$(100),verstag$(4)
  16. 1180 verstag$="1.05"
  17. 1190 Buff=ALCHP(256)
  18. 1200 Rows=14
  19. 1210 DIM D(Rows/2)
  20. 1220 OPEN#3;"Con_456x234a28x12"
  21. 1230 OPEN#4;"Scr_104x12a362x20"
  22. 1240 OPEN#5;"Scr_436x142a38x99"
  23. 1250 InFlg%=0
  24. 1260 REPeat outer_loop
  25. 1262  RETRY_HERE
  26. 1264  IF InFlg%<>0 THEN CLOSE#7:DELETE Dst$&"SYS_REF_dat":InFlg%=0
  27. 1270  IF COMPILED
  28. 1271   WHEN ERRor 
  29. 1272    PRINT #3\\"Error: "
  30. 1273    REPORT #3,ERNUM
  31. 1274    INPUT #3;\" Press ENTER to re-start.";Rplc$
  32. 1275    RETRY
  33. 1276   END WHEN 
  34. 1277  END IF 
  35. 1279  WINDOW#3;456,234,28,12:PAPER#3;0:INK#3;7:CLS#3:BORDER#3;3,2:BORDER#3;2,0:BORDER#3;1,2:WINDOW#3;438,220,36,19:BORDER#5;1,4:INK#5;4:PAPER#5;0
  36. 1280  CSIZE#3;2,1:PRINT#3;"SYS_REF v";verstag$:CSIZE#3;0,0
  37. 1290  PRINT#3;"CODE-PATCHER by MARK J SWIFT";
  38. 1300  CLS#4:BORDER#4;1,7:INK#4;4:CLS#5
  39. 1310  WINDOW#3;438,40,36,59
  40. 1320  IF InFlg%=0 THEN 
  41. 1330   INK#5;4
  42. 1340   PRINT#5;" SYS_REF is a patch utility to be used on tasks & M/C which fail when"
  43. 1350   PRINT#5;" the system variables are moved from their normal location of $28000"
  44. 1360   PRINT#5;" (i.e. under Minerva or Amiga-QDOS with the 2nd screen enabled)."
  45. 1380   PRINT#5;\" When patching CODEGEN_task of the TURBO compiler, patch all references"
  46. 1390   PRINT#5;" EXCEPT the two that refer to $28010. These are not part of the CODEGEN"
  47. 1400   PRINT#5;" code, but are included in all TURBO compiled programs. When patching"
  48. 1410   PRINT#5;" PARSER_task, or any other TURBO program replace ALL references."
  49. 1420   PRINT#5;\" The patched version of TURBO produces code identical to the unpatched"
  50. 1430   PRINT#5;" version, i.e. compiled tasks will require patching."
  51. 1440   PRINT#5;\" NOTE: SYS_REF makes all TURBO'ed & some QLIB'ed programs 32-bit clean."
  52. 1450   INPUT#3;\"Input FILE or VOLUME name  >";InFile$
  53. 1460   IF InFile$="" THEN EXIT outer_loop
  54. 1470   IF LEN(InFile$)=5 THEN 
  55. 1480    InFlg%=INT(((InFile$ INSTR "flp1_flp2_flp3_flp4_ram1_ram2_")+4)/5)
  56. 1490   ELSE 
  57. 1500    InFlg%=0
  58. 1510   END IF 
  59. 1520   IF InFlg%=0 THEN 
  60. 1530    INPUT#3;"         Output FILE name  >";OutFile$
  61. 1540    IF OutFile$="" THEN EXIT outer_loop
  62. 1550   ELSE 
  63. 1560    INPUT#3;"       Output VOLUME name  >";OutFile$
  64. 1570    IF OutFile$="" THEN InFlg%=0:EXIT outer_loop
  65. 1580    Src$=InFile$:Dst$=OutFile$
  66. 1590    DELETE Dst$&"SYS_REF_dat"
  67. 1600    OPEN_NEW#7;Dst$&"SYS_REF_dat"
  68. 1610    DIR#7;Src$:CLOSE#7
  69. 1620    OPEN_IN#7;Dst$&"SYS_REF_dat"
  70. 1630    INPUT#7;Name$,Space$
  71. 1640   END IF 
  72. 1650   CLS#5
  73. 1660  END IF 
  74. 1670  REPeat main_loop
  75. 1680   REPeat in_loop
  76. 1690    CLS#4:CLS#3:RPORT CHR$(10)
  77. 1700    IF InFlg%<>0 THEN 
  78. 1710     IF EOF(#7) THEN 
  79. 1720      EXIT main_loop
  80. 1730     ELSE 
  81. 1740      INPUT#7;InFile$
  82. 1750      OutFile$=Dst$&InFile$
  83. 1760      InFile$=Src$&InFile$
  84. 1770     END IF 
  85. 1780    END IF 
  86. 1790    OPEN_IN#6;InFile$
  87. 1800    fl=FLEN(#6):ft=FTYP(#6):IF ft THEN fd=FDAT(#6)
  88. 1810    CLOSE#6
  89. 1820    RPORT "File: "&InFile$&CHR$(10)
  90. 1830    IF fl=0 THEN 
  91. 1840     RPORT "File empty!"&CHR$(10)
  92. 1850     IF InFlg%=0 THEN EXIT main_loop
  93. 1860    ELSE 
  94. 1861     INK#3;4
  95. 1862     IF ft=1 AND fd<>0 THEN 
  96. 1864      RPORT "Executable TASK"&CHR$(10)
  97. 1866     ELSE 
  98. 1870      temp$=FILE_CLASS$(InFile$)
  99. 1880      IF temp$<>"" THEN 
  100. 1890       RPORT "Possible "&temp$&CHR$(10)
  101. 1900      END IF 
  102. 1902     END IF 
  103. 1904     INK#3;7
  104. 1910     IF InFlg%=0 THEN 
  105. 1920      EXIT in_loop
  106. 1930     ELSE 
  107. 1940      RPORT "Patch":Rplc$=WAITKEY$(3,"ynq")
  108. 1950      IF Rplc$=="y" THEN EXIT in_loop
  109. 1960      IF Rplc$=="q" THEN EXIT main_loop
  110. 1970     END IF 
  111. 1980    END IF 
  112. 1990   END REPeat in_loop
  113. 2000   CLS#5
  114. 2010   base=ALCHP(fl)
  115. 2020   IF base>0 THEN 
  116. 2030    LBYTES InFile$,base
  117. 2040   ELSE 
  118. 2050    PRINT#3;\"Out of memory!"
  119. 2060    EXIT outer_loop
  120. 2070   END IF 
  121. 2080   REMark do it
  122. 2090   NoRpc%=0
  123. 2100   fixSYSV
  124. 2110   IF NoRpc% THEN 
  125. 2120    RPORT "Saving..."&CHR$(10)
  126. 2130    IF ft=1 THEN 
  127. 2140     DELETE OutFile$
  128. 2150     SEXEC OutFile$,base,fl,fd
  129. 2160    ELSE 
  130. 2170     DELETE OutFile$
  131. 2180     SBYTES OutFile$,base,fl
  132. 2190    END IF 
  133. 2200   ELSE 
  134. 2210    RPORT "No changes."&CHR$(10)
  135. 2220   END IF 
  136. 2230   RECHP(base)
  137. 2240   IF (InFlg%=0) OR (NoRpc%=0) THEN 
  138. 2250    Rplc$=INKEY$(#3,200)
  139. 2260    IF InFlg%=0 THEN EXIT main_loop
  140. 2270   END IF 
  141. 2280  END REPeat main_loop
  142. 2310 END REPeat outer_loop
  143. 2320 RECHP(Buff)
  144. 2330 CLOSE#3
  145. 2340 CLOSE#4
  146. 2350 CLOSE#5
  147. 2360 IF InFlg%<>0 THEN CLOSE#7:DELETE OutFile$&"SYS_REF_dat":InFlg%=0
  148. 2370 STOP
  149. 2380 :
  150. 2390 DEFine PROCedure fixSYSV
  151. 2400  LOCal a,p,i,N,pk,pflg%
  152. 2410  CLS#4
  153. 2420  tskFlg%=((PEEK_W(base+6)=HEX("4AFB")) AND (ft<>0))
  154. 2430  IF tskFlg% THEN 
  155. 2440   nam$=""
  156. 2450   pk=PEEK_W(base+8)
  157. 2460   FOR i=0 TO pk-1
  158. 2470    nam$=nam$&CHR$(PEEK(base+10+i))
  159. 2480   END FOR i
  160. 2490   p=base+4+(6+2*INT((LEN(nam$)+1)/2))
  161. 2500  ELSE 
  162. 2510   p=base+4
  163. 2520  END IF 
  164. 2525  pflg%=0
  165. 2530  IF PEEK_L(p)=HEX("50544348") THEN 
  166. 2535   IF PEEK_L(p+4)<STRINGL(verstag$) THEN 
  167. 2540    RPORT "...patched with a previous version of SYS_REF "
  168. 2545   ELSE 
  169. 2546    pflg%=1
  170. 2547    RPORT "...already patched by a current version of SYS_REF "
  171. 2548   END IF 
  172. 2549   RPORT "(v"&LONGINT$(PEEK_L(p+4))&")"&CHR$(10)
  173. 2552   POKE_L p+4,STRINGL(verstag$)
  174. 2555   IF tskFlg% THEN 
  175. 2560    xl=78+4*PEEK_W(p+8)+2*INT((LEN(nam$)+1)/2)
  176. 2620   ELSE 
  177. 2630    xl=60+4*PEEK_W(p+8)
  178. 2640   END IF 
  179. 2650  ELSE 
  180. 2660   p=0:pch$="":Rplc$=""
  181. 2670   REPeat find_loop
  182. 2680    IF p>fl THEN EXIT find_loop
  183. 2690    FOR N=1 TO 256
  184. 2700     pk=PEEK_L(base+p)
  185. 2710     IF (pk>=HEX("28000")) AND (pk<HEX("28200")) THEN 
  186. 2720      DISOUT
  187. 2730      IF NOT(Rplc$=="a") THEN 
  188. 2740       RPORT "REPLACE":Rplc$=WAITKEY$(3,"ynaq")
  189. 2750       IF Rplc$=="q" THEN 
  190. 2760        pch$="":EXIT find_loop
  191. 2770       END IF 
  192. 2780      END IF 
  193. 2790      IF (Rplc$=="y") OR (Rplc$=="a") THEN 
  194. 2800       pch$=pch$&LONGINT$(p)
  195. 2810       NoRpc%=NoRpc%+1
  196. 2820      END IF 
  197. 2830     END IF 
  198. 2840     p=p+2
  199. 2850     IF p>=fl THEN EXIT N
  200. 2860    END FOR N
  201. 2870    IF p>fl THEN 
  202. 2880     BLOCK#4;100,10,0,0,4
  203. 2890    ELSE 
  204. 2900     BLOCK#4;INT((p/fl)*100),10,0,0,4
  205. 2910    END IF 
  206. 2920   END REPeat find_loop
  207. 2930   IF pch$<>"" THEN 
  208. 2940    IF tskFlg% THEN 
  209. 2950     xl=78+LEN(pch$)+2*INT((LEN(nam$)+1)/2)
  210. 2960    ELSE 
  211. 2970     xl=60+LEN(pch$)
  212. 2980    END IF 
  213. 2990    RECHP(base):fl=fl+xl:base=ALCHP(fl)
  214. 3000    RPORT "Extending file by $"&HEX$(xl,32)&" bytes"&CHR$(10)
  215. 3010    LBYTES InFile$,base+xl
  216. 3020    p=0
  217. 3030    REMark start:
  218. 3040    po "6000":POKE_W base+p,10+tskFlg%*(2+2+2+2*INT((LEN(nam$)+1)/2))+2+LEN(pch$):p=p+2:REMark bra skip
  219. 3050    IF tskFlg% THEN 
  220. 3060     po "0000"
  221. 3070     po "4AFB":REMark dc.w $4afb
  222. 3080     REMark jobname:
  223. 3090     POKE_W base+p,LEN(nam$):p=p+2
  224. 3100     FOR i=1 TO LEN(nam$):POKE base+p+i-1,CODE(nam$(i)):NEXT i:p=p+2*INT((LEN(nam$)+1)/2)
  225. 3110    END IF 
  226. 3120    po "5054":po "4348":POKE_L base+p,STRINGL(verstag$):p=p+4:REMark dc.b 'PTCHx.xx'
  227. 3130    REMark patch_tbl:
  228. 3140    POKE_W base+p,LEN(pch$)/4:p=p+2
  229. 3150    FOR i=1 TO LEN(pch$)-3 STEP 4:POKE_L base+p,STRINGL(pch$(i TO i+3)):p=p+4:NEXT i
  230. 3160    REMark skip:
  231. 3170    po "48E7":po "E0F0": REMark movem.l d0-d2/a0-a3,-(a7)
  232. 3180    po "7000":REMark moveq #0,d0
  233. 3190    po "4E41":REMark trap #1
  234. 3200    po "45FA":POKE_W base+p,36+12*tskFlg%:p=p+2:REMark lea patch_end(pc),a1
  235. 3210    po "43FA":POKE_W base+p,HEX("FFF0")-LEN(pch$):p=p+2:REMark lea patch_tbl(pc),a1
  236. 3220    po "3219":REMark move.w (a1)+,d1
  237. 3230    po "6012":REMark bra.s svdbra
  238. 3240    REMark svloop:
  239. 3250    po "2419":REMark move.l (a1)+,d2
  240. 3260    po "2032":po "2800":REMark move.l (a2,d2),d0
  241. 3270    po "0280":po "0000":po "7FFF":REMark andi.l #$7FFF,d0
  242. 3280    po "D088":REMark add.l a0,d0
  243. 3290    po "2580":po "2800":REMark move.l d0,(a2,d2)
  244. 3300    REMark svdbra:
  245. 3310    po "51C9":po "FFEC":REMark dbra d1,svloop
  246. 3320    IF tskFlg% THEN 
  247. 3330     po "203C":po "0000":POKE_W base+p,xl:p=p+2:REMark move.l #patch_end-start,d0
  248. 3340     po "DDC0":REMark adda.l d0,a6
  249. 3350     po "99C0":REMark suba.l d0,a4
  250. 3360     po "9BC0":REMark suba.l d0,a5
  251. 3370    END IF 
  252. 3380    po "4CDF":po "0F07":REMark movem.l (a7)+,d0-d2/a0-a3
  253. 3390    REMark patch_end:
  254. 3420   END IF 
  255. 3430  END IF 
  256. 3432  IF pflg%=0 THEN 
  257. 3435   fixTURBO
  258. 3436   IF RecogFlg%=0 THEN fixQLIB
  259. 3438  END IF 
  260. 3440 END DEFine 
  261. 3450 :
  262. 3460 DEFine PROCedure fixTURBO
  263. 3470  LOCal p,Q,N,find_loop
  264. 3480  RecogFlg%=0
  265. 3485  p=9984:IF fl<p THEN p=fl
  266. 3490  X=find(LONGINT$(HEX("20087E00"))&LONGINT$(HEX("24790002"))&LONGINT$(HEX("801045EA"))&LONGINT$(HEX("00682A0A")),FILL$(CHR$(255),16),base,0,p)
  267. 3660  IF X<>-1 THEN 
  268. 3665   RecogFlg%=-1
  269. 3670   RPORT "TURBO TASK:"&CHR$(10)
  270. 3680   unfixTURBO
  271. 3690   p=0:CLS#4:CLS#5
  272. 3700   REPeat find_loop
  273. 3710    IF p>fl THEN EXIT find_loop
  274. 3720    FOR N=1 TO 256
  275. 3730     temp$=HEX$(PEEK_L(base+p),32)
  276. 3740     IF temp$=="422E8AD4" THEN 
  277. 3750      POKE_L base+p,HEX("422E801D"):DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  278. 3760     ELSE 
  279. 3770      IF temp$=="57EE8AD4" THEN 
  280. 3780       POKE_L base+p,HEX("57EE801D"):DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  281. 3790      ELSE 
  282. 3800       IF temp$=="4A2E8AD4" THEN 
  283. 3810        POKE_L base+p,HEX("4A2E801D"):DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  284. 3820       END IF 
  285. 3830      END IF 
  286. 3840     END IF 
  287. 3850     p=p+2
  288. 3860     IF p>=fl THEN EXIT N
  289. 3870    END FOR N
  290. 3880    IF p>fl THEN 
  291. 3890     BLOCK#4;100,10,0,0,4
  292. 3900    ELSE 
  293. 3910     BLOCK#4;INT((p/fl)*100),10,0,0,4
  294. 3920    END IF 
  295. 3930   END REPeat find_loop
  296. 3940  END IF 
  297. 3950 END DEFine 
  298. 3960 :
  299. 3970 DEFine PROCedure fixQLIB
  300. 3980  LOCal l,N,i,X
  301. 3990  RecogFlg%=0
  302. 4000  X=find("Libe"&"rati",FILL$(CHR$(223),8),base,0,fl)
  303. 4020  IF X<>-1 THEN 
  304. 4025  RecogFlg%=-1
  305. 4030   REPeat loop
  306. 4040    X=X-1:IF PEEK(base+X)=0 THEN EXIT loop
  307. 4050   END REPeat loop
  308. 4060   l=PEEK_W(base+X)
  309. 4070   RESTORE 4880
  310. 4080   READ N:l=l-N-N:POKE_W base+X,l:POKE_L base+X+2,STRINGL(":-)"&CHR$(10)):X=X+l+2
  311. 4090   FOR i=0 TO N-1
  312. 4100    READ temp$:POKE_W base+X+i+i,HEX(temp$)
  313. 4110   NEXT i
  314. 4120   IF PEEK_W(base+6)<>HEX("4AFB") THEN 
  315. 4130    RPORT "QLIB CODE:"&CHR$(10)
  316. 4140   ELSE 
  317. 4150    RPORT "QLIB TASK:"&CHR$(10)
  318. 4160   END IF 
  319. 4170   p=X+48:CLS#4:CLS#5
  320. 4180   REPeat find_loop
  321. 4190    IF p>fl THEN EXIT find_loop
  322. 4200    FOR N=1 TO 256
  323. 4210     temp$=HEX$(PEEK_L(base+p),32)
  324. 4220     IF temp$=="46FC0000" THEN 
  325. 4230      POKE_L base+p,HEX("027CC0FF"):DISOUT:RPORT "tidying code at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  326. 4240     ELSE 
  327. 4250      IF (temp$=="20728004") THEN 
  328. 4260       POKE_W base+p,HEX("6100"):POKE_W base+p+2,(X+26)-(p+2):DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  329. 4270      ELSE 
  330. 4280       IF (temp$=="26725004") THEN 
  331. 4290        POKE_W base+p,HEX("6100"):POKE_W base+p+2,(X+12)-(p+2):DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  332. 4300       ELSE 
  333. 4310        IF (temp$=="26722004") THEN 
  334. 4320         POKE_W base+p,HEX("6100"):POKE_W base+p+2,X-(p+2)
  335. 4330         IF (HEX$(PEEK_W(base+p+4),32)=="200B") THEN 
  336. 4340          POKE_W base+p+4,HEX("4E71")
  337. 4350         END IF 
  338. 4360         DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  339. 4370        ELSE 
  340. 4380         IF (temp$=="26724004") THEN 
  341. 4390          POKE_W base+p,HEX("6100"):POKE_W base+p+2,(X+6)-(p+2)
  342. 4400          IF PEEK(base+p+18)=HEX("67") THEN 
  343. 4410           IF PEEK(base+p+20)=HEX("65") THEN 
  344. 4420            i=p+22+PEEK(base+p+21)
  345. 4430            IF (PEEK_W(base+i)==HEX("2A0B")) THEN 
  346. 4440             POKE_W base+i,HEX("2A00")
  347. 4450            END IF 
  348. 4460           END IF 
  349. 4470          END IF 
  350. 4480          DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  351. 4490         ELSE 
  352. 4500          IF (temp$=="20322004") THEN 
  353. 4510           POKE_W base+p,HEX("6100"):POKE_W base+p+2,(X+32)-(p+2)
  354. 4520           IF (PEEK_W(base+p+6)==HEX("2040")) THEN 
  355. 4530            POKE_W base+p+6,HEX("4E71")
  356. 4540           END IF 
  357. 4550           DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  358. 4560          ELSE 
  359. 4570           IF (temp$=="24321004") THEN 
  360. 4580            IF (HEX$(PEEK_L(base+p+4),32)=="6A080C82") AND (HEX$(PEEK_L(base+p+8),32)=="FFFFFFFF") AND (HEX$(PEEK_W(base+p+12),16)=="6710") THEN 
  361. 4590             p=p+4:POKE_L base+p,HEX("70FFB480"):POKE_L base+p+4,HEX("6714E98A"):POKE_W base+p+8,HEX("E88A")
  362. 4600            END IF 
  363. 4610            DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  364. 4620           ELSE 
  365. 4630            IF (temp$=="2640586B") THEN 
  366. 4640             IF (HEX$(PEEK_L(base+p+4),32)=="00120800") AND (HEX$(PEEK_L(base+p+8),32)=="001D6714") THEN 
  367. 4650              POKE_W base+p,HEX("6100"):POKE_W base+p+2,(X+16)-(p+2):POKE_L base+p+4,HEX("586B0012"):POKE_L base+p+8,HEX("E5886A14")
  368. 4660              DISOUT:RPORT "32 bit fix at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  369. 4670             END IF 
  370. 4680            END IF 
  371. 4690           END IF 
  372. 4700          END IF 
  373. 4710         END IF 
  374. 4720        END IF 
  375. 4730       END IF 
  376. 4740      END IF 
  377. 4750     END IF 
  378. 4760     p=p+2
  379. 4770     IF p>=fl THEN EXIT N
  380. 4780    END FOR N
  381. 4790    IF p>fl THEN 
  382. 4800     BLOCK#4;100,10,0,0,4
  383. 4810    ELSE 
  384. 4820     BLOCK#4;INT((p/fl)*100),10,0,0,4
  385. 4830    END IF 
  386. 4840   END REPeat find_loop
  387. 4850  END IF 
  388. 4860 END DEFine 
  389. 4870 :
  390. 4880 DATA 24
  391. 4890 DATA "2032","2004","600A","2032","4004","6004","2032","5004"
  392. 4900 DATA "2640","E988","E888","C18B","4E75","2032","8004","6004"
  393. 4910 DATA "2032","2004","2040","E988","E888","C188","4A80","4E75"
  394. 4920 :
  395. 4930 DEFine PROCedure unfixTURBO
  396. 4940    RPORT "removing old patches..."&CHR$(10)
  397. 4950    p=0:CLS#4:CLS#5
  398. 4960    REPeat find_loop
  399. 4970     IF p>fl THEN EXIT find_loop
  400. 4980     FOR N=1 TO 256
  401. 4990      temp$=HEX$(PEEK_L(base+p),32)
  402. 5000      IF temp$=="08920007" THEN 
  403. 5010       POKE_L base+p,HEX("422E8AD4"):DISOUT:RPORT "old fix removed at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  404. 5020      ELSE 
  405. 5030       IF temp$=="660203D2" THEN 
  406. 5040        POKE_L base+p,HEX("57EE8AD4"):DISOUT:RPORT "old fix removed at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  407. 5050       ELSE 
  408. 5060        IF temp$(1 TO 6)=="8AD46D" THEN 
  409. 5070          p=p+2:POKE base+p,HEX("66"):DISOUT:RPORT "old fix removed at $"&HEX$(p,32)&CHR$(10):NoRpc%=NoRpc%+1
  410. 5080        END IF 
  411. 5090       END IF 
  412. 5100      END IF 
  413. 5110      p=p+2
  414. 5120      IF p>=fl THEN EXIT N
  415. 5130     END FOR N
  416. 5140     IF p>fl THEN 
  417. 5150      BLOCK#4;100,10,0,0,4
  418. 5160     ELSE 
  419. 5170      BLOCK#4;INT((p/fl)*100),10,0,0,4
  420. 5180     END IF 
  421. 5190    END REPeat find_loop
  422. 5200 END DEFine 
  423. 5210 :
  424. 5220 DEFine PROCedure po(a$)
  425. 5230  POKE_W base+p,HEX(a$):p=p+2
  426. 5240 END DEFine 
  427. 5250 :
  428. 10000 DEFine PROCedure DISOUT
  429. 10010  LOCal loop, preLoop, disLoop
  430. 10020  LOCal r, Ds, Q, N, c, i
  431. 10030  r=Rows/2
  432. 10040  Ds=0
  433. 10050  FOR i=1 TO r
  434. 10060   D(i)=0
  435. 10070  END FOR i
  436. 10080  Q=p-8*r
  437. 10090  IF Q<0 THEN Q=0
  438. 10100  REPeat preLoop
  439. 10110   N=D68K(base+Q,Q\Buff)
  440. 10120   Q=Q+N
  441. 10130   Ds=Ds-D(i)+N
  442. 10140   D(i)=N
  443. 10150   REPeat loop
  444. 10160    i=1+(i MOD r)
  445. 10170    N=N-6
  446. 10180    IF N<=0 THEN EXIT loop
  447. 10190    Ds=Ds-D(i)
  448. 10200    D(i)=0
  449. 10210   END REPeat loop
  450. 10220   IF Q>=p THEN EXIT preLoop
  451. 10230  END REPeat preLoop
  452. 10240  CLS#5
  453. 10250  Q=Q-Ds
  454. 10260  r=Rows
  455. 10270  dflag=0
  456. 10280  REPeat disLoop
  457. 10290   N=D68K(base+Q,Q\Buff)
  458. 10300   i=0:P$=" "
  459. 10310   REPeat loop
  460. 10320    c=PEEK(Buff+i)
  461. 10330    IF c=0 THEN EXIT loop
  462. 10340    i=i+1
  463. 10350    P$=P$(1 TO LEN(P$))&CHR$(c)
  464. 10360   END REPeat loop
  465. 10370   IF (Q<=p) AND ((Q+N)>p) THEN 
  466. 10380    IF dflag AND NOT("tas" INSTR P$(1 TO LEN(P$)))
  467. 10390     P$=P$(1 TO 14)&"         dc.w      $"&P$(11 TO 14)&CHR$(10):dflag=1:N=2
  468. 10400     INK#5;4
  469. 10410    ELSE 
  470. 10420     INK#5;7
  471. 10430    END IF 
  472. 10440   ELSE 
  473. 10450    INK#5;4
  474. 10460     dflag="dc." INSTR P$(1 TO LEN(P$))
  475. 10470   END IF 
  476. 10480   Q=Q+N
  477. 10490   r=r-((N+5) DIV 6)
  478. 10500   IF r<0 THEN EXIT disLoop
  479. 10510   PRINT#5;P$(1 TO LEN(P$));
  480. 10520  END REPeat disLoop
  481. 10530 END DEFine 
  482. 10540 :
  483. 10550 DEFine FuNction FILE_CLASS$(i$)
  484. 10560  i=0
  485. 10570  REPeat check_loop
  486. 10580   j="_" INSTR i$(i+1 TO LEN(i$))
  487. 10590   IF j=0 THEN EXIT check_loop
  488. 10600   i=i+j
  489. 10610   IF i=LEN(i$) THEN RETurn ""
  490. 10620  END REPeat check_loop
  491. 10630  IF i=0 THEN 
  492. 10640   j=-1
  493. 10650  ELSE 
  494. 10660   IF (i=5) AND (i$(1 TO i) INSTR "ram1_ram2_flp1_flp2_mdv1_mdv2_") THEN 
  495. 10670    j=-1
  496. 10680   END IF 
  497. 10690  END IF 
  498. 10700  IF j<>0 THEN 
  499. 10710   j="_"&i$(i+1 TO LEN(i$))&"_" INSTR "_BOOT_"
  500. 10720   SELect ON j
  501. 10730   =1:a$="SuperBASIC boot program"
  502. 10740   =REMAINDER :a$=""
  503. 10750   END SELect 
  504. 10760   RETurn a$
  505. 10770  ELSE 
  506. 10780   a$=""
  507. 10790   j=(i$(i TO LEN(i$))&"_") INSTR "_c_h_bas_fth_asm_list_txt_text_scr_doc_aba_prg_grf_hob_arc_zip_font_fnt_boot_asc_screen_dbf_scn_log_task_job_bin_code_rext_inc_"
  508. 10800   SELect ON j
  509. 10810   =1:a$="C source"
  510. 10820   =3:a$="C header file"
  511. 10830   =5:a$="SuperBASIC program"
  512. 10840   =9:a$="FORTH program"
  513. 10850   =13:a$="Assembler source"
  514. 10860   =17:a$="Assembler list file"
  515. 10870   =123:a$="Assembler include file"
  516. 10880   =22,26,77,96:a$="ASCII text file"
  517. 10890   =31,81:a$="Screen-save"
  518. 10900   =35:a$="QUILL wordprocess document"
  519. 10910   =39:a$="ABACUS spreadsheet document"
  520. 10920   =43:a$="ARCHIVE program document"
  521. 10930   =88:a$="ARCHIVE database file"
  522. 10940   =92:a$="ARCHIVE screen layout"
  523. 10950   =47:a$="EASEL chart document"
  524. 10960   =51:a$="Psion help file"
  525. 10970   =55:a$="ARC file archive"
  526. 10980   =59:a$="ZIP file archive"
  527. 10990   =63,68:a$="Alternative character set"
  528. 11000   =72:a$="SuperBASIC boot program"
  529. 11010   =100,105:a$="executable TASK"
  530. 11020   =109,113:a$="Machine code"
  531. 11030   =118:a$="Resident extension code"
  532. 11040   =REMAINDER :a$=""
  533. 11050   END SELect 
  534. 11060  END IF 
  535. 11070  RETurn a$
  536. 11080 END DEFine 
  537. 11090 :
  538. 11100 DEFine FuNction WAITKEY$(Chan%,i$)
  539. 11110  LOCal K$(1),i,l,prompt_loop,get_loop
  540. 11120  RPORT " ("
  541. 11130  i=1:l=LEN(i$)
  542. 11140  REPeat prompt_loop
  543. 11150   RPORT i$(i):i=i+1
  544. 11160   IF i>l THEN EXIT prompt_loop
  545. 11170   RPORT "/"
  546. 11180  END REPeat prompt_loop
  547. 11190  RPORT ")? >"
  548. 11200  CURSEN#Chan%
  549. 11210  REPeat get_loop
  550. 11220   K$=INKEY$(#Chan%,-1)
  551. 11230   IF K$ INSTR i$ THEN EXIT get_loop
  552. 11240  END REPeat get_loop
  553. 11250  CURDIS#Chan%
  554. 11260  RPORT K$&CHR$(10)
  555. 11270  RETurn K$
  556. 11280 END DEFine 
  557. 11290 :
  558. 11300 DEFine PROCedure RPORT(temp$)
  559. 11310  PRINT#3;temp$;
  560. 11320 END DEFine 
  561. 11330 :
  562. 11340 DEFine FuNction find(txt$,msk$,base,s,e)
  563. 11350  LOCal i,j,K,l
  564. 11360  CLS#4
  565. 11370  l=-1
  566. 11380  i=s
  567. 11390  REPeat i_loop
  568. 11400   j=0
  569. 11410   REPeat j_loop
  570. 11420    K=0
  571. 11430    REPeat k_loop
  572. 11440     IF (PEEK(base+i+j+K)&&CODE(msk$(K+1)))<>(CODE(txt$(K+1))&&CODE(msk$(K+1))) THEN EXIT k_loop
  573. 11450     K=K+1
  574. 11460     IF K=LEN(txt$) THEN 
  575. 11470      l=i+j:EXIT i_loop
  576. 11480     END IF 
  577. 11490    END REPeat k_loop
  578. 11500    j=j+1
  579. 11510    IF j=256 THEN EXIT j_loop
  580. 11520   END REPeat j_loop
  581. 11530   IF i>=e THEN 
  582. 11540    BLOCK #4,100,10,0,0,4
  583. 11550   ELSE 
  584. 11560    BLOCK#4;((i-s)/(e-s))*100,10,0,0,4
  585. 11570   END IF 
  586. 11580   i=i+256
  587. 11590   IF (i-e)>=256 THEN EXIT i_loop
  588. 11600  END REPeat i_loop
  589. 11610  RETurn l
  590. 11620 END DEFine 
  591. 11630 :
  592.